package com.biz.primus.ms.product.interfaces;

import com.biz.primus.base.enums.commodity.DeliverType;
import com.biz.primus.base.exception.BizSilentException;
import com.biz.primus.base.vo.ExtendProductVo;
import com.biz.primus.base.vo.ProductPromotionTagRespVo;
import com.biz.primus.base.vo.ProductSpecialOfferPromotionRespVo;
import com.biz.primus.base.vo.PromotionBasicInfoVo;
import com.biz.primus.base.vo.commodity.ProductBaseVo;
import com.biz.primus.base.vo.commodity.ProductFinalPriceVo;
import com.biz.primus.base.vo.commodity.ProductPriceVo;
import com.biz.primus.base.vo.commodity.ProductStockVo;
import com.biz.primus.base.vo.search.ProductIdxVo;
import com.biz.primus.commodity.vo.CommodityVo;
import com.biz.primus.commodity.vo.frontend.ProductCustomModelVo;
import com.google.common.collect.Lists;

import java.io.Serializable;
import java.util.List;

/**
 * 商品原型数据接口
 *
 * @author david-liu
 * @date 2017年01月17日
 * @reviewer
 */
public interface ProductPrototype extends Serializable {

    ProductSpecialOfferPromotionRespVo getProductSpecialOfferPromotion();

    ProductCustomModelVo getProductCustomModelVo();

    ProductPromotionTagRespVo getProductPromotionTagRespVo();

    ProductStockVo getProductStockVo();

    Long getProductId();

    Long getVendorId();

    String getProductName();

    Integer getProductType();

    String getLogo();

    ProductPriceVo getProductPriceVo();

    ProductFinalPriceVo getProductFinalPriceVo();

    Integer getDepotStock();

    CommodityVo getCommodityVo();

    ProductBaseVo getProductBaseVo();

    Integer getSaleStatus();

    List<String> getApartTags();

    Boolean validate(Integer userLevel, Boolean validateStock);

    void validateWithException(Integer userLevel, Boolean validateStock) throws BizSilentException;

    String getProductCode();

    String getVendorProductCode();

    String getSubTitle();

    Long vendorId();

    ProductIdxVo toProductIdx(String depotCode);

    Long getBrandId();

    Long getCategoryId();

    List<String> getProductImages();

    Integer getWeight();

    DeliverType getDeliverType();

    String getCategoryName();

    String getBrandName();

    List<String> getIntroImages();

    Boolean getOpenKuaiheMode();

    /**
     * 配送时间
     */
    Integer getPredictTime();

    List<String> getSaletagIds();

    /**
     * 历史销量
     */
    Integer getSalesVolume();

    /**
     * 清空省仓库存,购物车使用
     */
    void clearWarehouseStock();

    /**
     * 新扩展属性
     *
     * @return
     */
    List<ExtendProductVo> getExtends();

    /**
     * A类商品是否在销售区域
     *
     * @return
     */
    Boolean inSaleArea(String targetSaleArea);

    default Integer getStock() {
        return 0;
    }

    /**
     * 商品促销详情
     *
     * @return
     */
    default List<PromotionBasicInfoVo> getPromotionBasicInfoVos() {
        return Lists.newArrayList();
    }
}
